package cn.funeralobjects.aoss.service;

import cn.funeralobjects.aoss.BasicInfo;
import cn.funeralobjects.aoss.entity.EBucket;
import cn.funeralobjects.aoss.enums.BucketAction;
import cn.funeralobjects.aoss.model.Bucket;
import cn.funeralobjects.aoss.model.BucketRam;
import cn.funeralobjects.aoss.model.BucketStsAccessKey;
import cn.funeralobjects.common.service.CommonCloudCrudService;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.SimplifiedObjectMeta;
import reactor.core.publisher.Mono;

import java.util.List;
import java.util.Optional;

/**
 * Service of Bucket
 *
 * @author FuneralObjects
 * Create date: 2020/6/1 10:03 AM
 */
public interface BucketService extends CommonCloudCrudService<Bucket, EBucket, Integer> {

    String ENTITY_NAME = "Bucket";

    /**
     * 判断是否存在同名资源包
     *
     * @param prodResCode 资源编码
     * @param name        资源包名
     * @return true - 存在
     */
    boolean existsNameInProdRes(String prodResCode, String name);

    /**
     * 通过id 获取名称
     *
     * @param id id
     * @return 名称
     */
    Optional<String> getNameById(Integer id);

    /**
     * 绑定ram角色
     *
     * @param id          bucketId
     * @param ramRoleCode 角色编码
     */
    void bindRamRole(Integer id, String ramRoleCode);

    /**
     * 判断是否存在同名资源包
     *
     * @param prodResCode 资源编码
     * @param name        资源包名
     * @param withoutId   排除id
     * @return true - 存在
     */
    boolean existsNameInProdRes(String prodResCode, String name, Integer withoutId);

    /**
     * 查询Bucket
     *
     * @param prodRes 资源编码
     * @param name    名称
     * @return 实体数据
     */
    Optional<EBucket> findOneByNameInProdRes(String prodRes, String name);

    /**
     * 批量添加Bucket
     *
     * @param buckets bucket集合
     * @return 实体数据
     */
    List<EBucket> addIfNotExistsInBatch(List<Bucket> buckets);

    BucketStsAccessKey createStsAccessKey(Integer id, Integer stsProdResId, BucketAction action, String path, Long duration);

    SimplifiedObjectMeta getSimplifiedObjectMeta(Integer id, String objectPath);

    ObjectMetadata headObjectMeta(Integer id, String objectPath);

    Optional<BucketRam> findRamById(Integer id);

    /**
     * 同步bucket数据
     *
     * @param prodResCode 资源编码
     * @return bucket集合
     */
    Mono<List<EBucket>> syncFromCloudByProductRes(String prodResCode);

    /**
     * entity_name
     *
     * @return name
     */
    @Override
    default String getName() {
        return ENTITY_NAME;
    }

    /**
     * module_name
     *
     * @return module_name
     */
    @Override
    default String getModuleName() {
        return BasicInfo.MODULE_NAME;
    }
}
